﻿using System;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.IO;

namespace Kyoh.Lib.WinForms
{
    /// <summary><see cref="FileSystemTreeView"/> の各ノード クラスです。</summary>
    public class FileSystemTreeNode : TreeNode
    {
        /// <summary>サブノードがあることを示すためにダミーで追加されるノードのキー。</summary>
        public const string DummyNodeKey = "DummyNode";
        /// <summary>ラベル テキストと、ツリー ノードが選択されているときと選択されていないときに表示するイメージをそれぞれ指定して、<see cref="FileSystemTreeNode"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="text">新しいツリー ノードのラベル テキスト。</param>
        /// <param name="imageIndex">ツリー ノードが選択されていないときに表示する System.Drawing.Image のインデックス値。</param>
        /// <param name="selectedImageIndex">ツリー ノードが選択されているときに表示する System.Drawing.Image のインデックス値。</param>
        /// <param name="path">ノードに対応するパス。</param>
        public FileSystemTreeNode(string text, int imageIndex, int selectedImageIndex, string path)
            : base(text, imageIndex, selectedImageIndex)
        {
            if (string.IsNullOrEmpty(path))
            {
                Path = null;
                HasDummy = false;
            }
            else
            {
                Path = path;
                if (System.IO.Path.GetPathRoot(path).TrimEnd('\\') == path.TrimEnd('\\'))
                    Name = path.TrimEnd('\\');
                else
                    Name = System.IO.Path.GetFileName(path);
                Nodes.Add(DummyNodeKey, DummyNodeKey);
                HasDummy = true;
            }
        }

        /// <summary>ノードの状態を読込みます。</summary>
        protected override void Deserialize(SerializationInfo serializationInfo, StreamingContext context)
        {
            Path = serializationInfo.GetString("Path");
            HasDummy = serializationInfo.GetBoolean("HasDummy");
        }

        /// <summary>ノードの状態を保存します。</summary>
        protected override void Serialize(SerializationInfo si, StreamingContext context)
        {
            si.AddValue("Path", Path);
            si.AddValue("HasDummy", HasDummy);
            base.Serialize(si, context);
        }
        
        /// <summary>ノードの指し示すファイルシステムのパスを取得または設定します。</summary>
        public string Path { get; private set; }

        /// <summary>ダミーの子ノードを持っているかどうかを取得または設定します。</summary>
        public bool HasDummy { get; set; }
    }
}
